package com.tjetc.custumer;

import java.util.StringJoiner;

/**
 * 基础异常类
 * 扩展原始异常中没有错误编码和方法的传递参数
 */
public abstract class BaseException extends RuntimeException {
    // 业务编码
    protected ExplicableErrorCode errorCode;
    // 调用方法所传递的参数
    protected Object[] args;

    public BaseException() {
    }

    public BaseException(ExplicableErrorCode errorCode) {
        this.errorCode = errorCode;
    }

    public BaseException(ExplicableErrorCode errorCode, Object[] args) {
        this.errorCode = errorCode;
        this.args = args;
    }

    public ExplicableErrorCode getErrorCode() {
        return errorCode;
    }

    // 父类的一个通用方法获取 错误信息
    public String getErrorMsg() {
        if (errorCode == null) {
            return null;
        }

        return String.format(errorCode.getMsg(), this.args);
    }

    // 自己规范了 toString需要输出的内容格式
    @Override
    public String toString() {
        return new StringJoiner(" ,")
                // 获取当前类的名称
                .add("[" + this.getClass().getSimpleName() + "]")
                .add("ErrorCode = [" + errorCode + "]")
                .add("Msg = [" + String.format(errorCode.getMsg(), this.args) + "]")
                .toString();
    }

    // 重写的父类的方法
    @Override
    public String getMessage() {
        return toString();
    }
}
